package teste.br.com.unicarioca.domineduplex;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;

public class ZupoProgressBar {

	public static void main(String[] args) {
		JFrame frame = new JFrame();
		frame.setPreferredSize(new Dimension(165,85));
		frame.setTitle("TesteProgress");
		final Progress progress = new Progress();
		frame.add(progress,BorderLayout.CENTER);
		JButton btn = new JButton("Iniciar");
		btn.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e) {
				//iniciar
				Thread t = new Thread(){
					
					public void run() {
						for(int j = 0; j <= 100; j++){
							try {
								progress.setPorcentagem(j);
								Thread.sleep(100);
							} catch (InterruptedException e1) {
								e1.printStackTrace();
							}
						}
					}
				};
				t.start();
			}
			
		});
		frame.add(btn,BorderLayout.SOUTH);
		
		frame.pack();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
		
		
	}

}
class Progress extends JComponent implements MouseListener,MouseMotionListener{
	
	private float porcentagem = 0;
	private Color corDeCima = Color.LIGHT_GRAY;
	private Color corDeBaixo = Color.BLACK;
	
	public Progress(){
		this.addMouseListener(this);
		this.addMouseMotionListener(this);
	}
	
	public void setPorcentagem(float per){
		porcentagem = per;
		repaint();
	}
	
	@Override
	public void paint(Graphics graph) {
		//FIXME Erro as vezes, ele conta como se houvesse mais uma bolota escondida depois de redimensionar 
		//Deve ser por valores quebrados
		
		//Melhor com par
		final int diametro = 14 ;
		final int incrementoHorizontal = diametro + 3;
		final int transpMinima = 70;
		int inicioX = 5;
		final int alturaY = (this.getHeight()/2)-diametro/2;
		Graphics2D g2d = (Graphics2D) graph;
		g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
		g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
		
		//verificar quantas ovals cabem
		int tamanho = this.getWidth();
		int oval = Math.abs(tamanho /incrementoHorizontal);
		int resto = tamanho % incrementoHorizontal;
		int prop = 100/oval;
		int cheios = (int) porcentagem / prop;
		int grau = (int) porcentagem % prop ;
		int x = (inicioX+resto/2)-inicioX/2 ;//setando o ponto inicial da primeira bolinha
		
		GradientPaint gp = new GradientPaint(x+diametro/2, alturaY, corDeCima, x+diametro/2, alturaY+diametro,corDeBaixo, true);
		g2d.setPaint(gp);
		for(int i = 0; i < cheios; i++){
			//Pinta as bolas completas
			g2d.fillOval(x, alturaY, diametro, diametro);
			x+= incrementoHorizontal;
			oval--;
		}
		if(porcentagem != 0 && porcentagem != 100){
			//pinta a bola atual
			int fator = Math.min(255,((int)(grau*25.5) + transpMinima) );
			gp = new GradientPaint(x+diametro/2, alturaY, new Color(192,192,192,fator), x+diametro/2, alturaY+diametro,new Color(0,0,0,fator), false);
			g2d.setPaint(gp);
			g2d.fillOval(x, alturaY, diametro, diametro);
			x+= incrementoHorizontal;
			oval--;
		}
		gp = new GradientPaint(x+diametro/2, alturaY, 
				new Color(corDeCima.getRed(),corDeCima.getGreen(),corDeCima.getBlue(),transpMinima),
				x+diametro/2, alturaY,
				new Color(corDeBaixo.getRed(),corDeBaixo.getGreen(),corDeBaixo.getBlue(),transpMinima), false);
		g2d.setPaint(gp);
		for(int i = 0; i < oval; i++){
			//pinta as bolas faltando
			g2d.fillOval(x, alturaY, diametro, diametro);
			x+= incrementoHorizontal;
		}
		
		if(mostrarTooltip){
			//TODO Centralizar texto
			int pos = tamanho/2 - 14 ;
			g2d.setColor( new Color(255,255,255,160));
			g2d.fillRoundRect(pos - 6,alturaY - 3, 45, 20, 10, 10);
			g2d.setColor(Color.BLACK);
			g2d.setFont(new Font("ARIAL",Font.BOLD,14));
			g2d.drawString( ((int)porcentagem)+"%", pos, alturaY + 12 );
		}
	}
	
	private boolean mostrarTooltip = false;
	//private boolean entrou = false;
	//private Thread t;
	public void mouseEntered(MouseEvent e) {
		mostrarTooltip = true;
		repaint();
	}
	public void mouseExited(MouseEvent e) {
		mostrarTooltip = false;
		repaint();
	}
	public void mouseMoved(MouseEvent e) {
		/*
		if(entrou){
			if(t != null)
				t.interrupt();
			
			mostrarTooltip = false;
			
			t = new Thread(){
				@Override
				public void run() {
					try {
						Thread.sleep(3000);
					} catch (InterruptedException e) {}
					iniciarContador();
				}
			};
			t.start();
			mostrarTooltip = false;
		}
		*/
	}
	/*
	private void iniciarContador(){
		mostrarTooltip = true;
		repaint();
	}
	*/	
	public void mouseClicked(MouseEvent e) {}
	public void mousePressed(MouseEvent e) {}
	public void mouseReleased(MouseEvent e) {}
	public void mouseDragged(MouseEvent e) {}	
}